package com.eliza.kotlin.design.structure.proxy.jdk_proxy

import java.lang.reflect.Proxy


/*-*- coding:utf-8 -*-
 * @Author  : debi
 * @Time    : 6/5/22
 * @Software: IntelliJ IDEA
 */
class ProxyFactory2 {
    private val obj = TrainStation()
    fun getProxyObject(): SellTickets {
        //返回代理对象
        /*
            ClassLoader loader : 类加载器，用于加载代理类。可以通过目标对象获取类加载器
            Class<?>[] interfaces ： 代理类实现的接口的字节码对象
            InvocationHandler h ： 代理对象的调用处理程序
         */
        return Proxy.newProxyInstance(
            obj.javaClass.classLoader,
            obj.javaClass.interfaces
        ) { proxy, method, args ->
            /*
                   Object proxy : 代理对象。和proxyObject对象是同一个对象，在invoke方法中基本不用
                   Method method ： 对接口中的方法进行封装的method对象
                   Object[] args ： 调用方法的实际参数
                   返回值： 方法的返回值。
                */
            //System.out.println("invoke方法执行了");
            println("代售点收取一定的服务费用(jdk动态代理)")


            //执行目标对象的方法

//            method.invoke(obj, *args) // java 直接转 kt

            method.invoke(obj, *args ?: arrayOf<Any>()) // 解决方案




        } as SellTickets
    }


}

